# 需求：封装一个DBToll的类，方便其它文件调用，不用反复书写连接数据库的代码
# 只有增删改查的sql语句会有变化，把这些代码写在公有方法中。方便别的文件调用。
# 其它的语句都不需要外部访问使用，就定义成私有方法

import pymysql

# 创建工具类
class DBTool(object):
    # 后续代码中需要不停的使用游标和连接对象，所以就可以把它们设置成类属性
    # 游标和连接对象只能自己内部用，所以要定义成私有类属性
    # 为了最后关闭时候的判断依据
    __con = None
    __cur = None

    @classmethod
    # 调用的时候返回连接对象
    def __get_con(cls):
        cls.__con = pymysql.connect(
            host="localhost",
            port=3306,
            user="root",
            password="123456",
            database="books",
            charset="utf8")
        return cls.__con

    @classmethod
    def __get_cur(cls):
        # 调用获取连接对象方法，获取到连接对象后，点生成游标对象，存到类属性__cur中
        cls.__cur = cls.__get_con().cursor()
        return cls.__cur

    # 公有的类方法，方便其它人调用设置sql语句
    @classmethod
    def exe_sql(cls,sql):
        try:
            cls.__cur = cls.__get_cur()
            cls.__cur.execute(sql)
            # 判断如果是查询，就直接返回查询结果
            if sql.split()[0].lower() == "select":
                return cls.__cur.fetchall()

            # 判断如果是增删改，就要执行提交
            else:
                cls.__con.commit()
                return "成功啦~"

        except Exception as e:
            cls.__con.rollback()
            print(e)

        finally:
            cls.__close_cur()
            cls.__close_con()

    @classmethod
    def __close_cur(cls):
        if cls.__cur:
            cls.__cur.close()
            cls.__cur = None    # 使用完毕后，把变量恢复成初始值，方便下次调用


    @classmethod
    def __close_con(cls):
        if cls.__con:
            cls.__con.close()
            cls.__con = None  # 使用完毕后，把变量恢复成初始值，方便下次调用



